home *** CD-ROM | disk | FTP | other *** search
- unit uFMASync;
-
- {
- *******************************************************************************
- * Descriptions: FMA Contact Sync Unit
- * $Source: /cvsroot/fma/fma/uFMASync.pas,v $
- * $Locker: $
- *
- * Todo:
- * - Deal with contacts marked as Deleted, but are not deleted yet.
- * This is a problem when conflicts arize (deleted and updated).
- *
- * Change Log:
- * $Log: uFMASync.pas,v $
- * Revision 1.3 2004/06/25 18:27:09 lordlarry
- * Added this changelog header
- *
- *
- }
-
- interface
-
- uses
- uContactSync, uSyncPhonebook;
-
- type
- TContactDataState = (cdsNew, cdsModified, cdsDeleted, cdsNormal);
-
- TFMAContact = class(TContact)
- private
- FFMAContact: PContactData;
- protected
- function Exists: Boolean; override;
- public
- property FMAContact: PContactData read FFMAContact write FFMAContact;
-
- // function IsDeleted: Boolean; override;
- end;
-
- TFMAContactSource = class(TContactSource)
- protected
- function GetName: String; override;
- procedure Read(Contact: TFMAContact; FMAContact: PContactData);
- public
- function New: TContact; override;
- function Add(Value: TContact): TContact; override;
- procedure Update(Contact, Value: TContact); override;
- procedure Delete(Contact: TContact); override;
-
- procedure Load; override;
- end;
-
- implementation
-
- uses
- Unit1, VirtualTrees, Dialogs, SysUtils, Forms;
-
- { TFMAContactSource }
-
- function TFMAContactSource.Add(Value: TContact): TContact;
- var Contact: TFMAContact;
- ContactData: PContactData;
- begin
- Contact := New as TFMAContact;
- Contact.Clone(Value);
- Contact.LinkedContact := Value;
- Value.LinkedContact := Contact;
- Contacts.Add(Contact);
-
- with Form1.frmSyncPhonebook do begin
- if ListContacts.ChildCount[nil] >= FMaxRecME then
- raise ESynchronize.CreateFmt('No more space in phonebook memory! %d is the maximum', [FMaxRecME]);
-
- ContactData := ListContacts.GetNodeData(ListContacts.AddChild(nil));
- ContactData.CDID := NewGUID;
- end;
-
- Contact.FMAContact := ContactData;
- with Contact.FMAContact^ do begin
- Title := Contact.Title;
- Name := Contact.Name;
- SurName := Contact.SurName;
- Org := Contact.Organization;
- Email := Contact.Email;
- Home := Contact.HomePhone;
- Work := Contact.WorkPhone;
- Cell := Contact.CellPhone;
- Fax := Contact.FaxPhone;
- Other := Contact.OtherPhone;
-
- StateIndex := Integer(cdsNew);
-
- Contact.ID := GUIDToString(CDID);
- end;
-
- Result := Contact;
- end;
-
- procedure TFMAContactSource.Delete(Contact: TContact);
- begin
- with Contact as TFMAContact do begin
- FMAContact.StateIndex := Integer(cdsDeleted);
- FMAContact := nil;
- end;
- end;
-
- function TFMAContactSource.GetName: String;
- begin
- Result := 'FMA';
- end;
-
- procedure TFMAContactSource.Load;
- var FMAContact: PContactData;
- Contact: TFMAContact;
- Node: PVirtualNode;
- Count, CountNew, CountFiltered: Integer;
- begin
- with Form1.frmSyncPhonebook.ListContacts do begin
- Count := 0;
- CountNew := 0;
- CountFiltered := 0;
-
- Node := GetFirst;
- while Assigned(Node) do begin
- FMAContact := GetNodeData(Node);
-
- if TContactDataState(FMAContact.StateIndex) <> cdsDeleted then begin
- Contact := Contacts.FindByID(GUIDToString(FMAContact.CDID)) as TFMAContact;
-
- if Assigned(Contact) then begin
- Contact.FMAContact := FMAContact;
- end
- else begin
- Contact := New as TFMAContact;
- Contact.ID := GUIDToString(FMAContact.CDID);
- Contact.SyncHash := Contact.Hash;
- Contact.FMAContact := FMAContact;
- Contacts.Add(Contact);
-
- Inc(CountNew);
- end;
-
- Read(Contact, FMAContact);
-
- Inc(Count);
- end
- else
- Inc(CountFiltered);
-
- Node := GetNext(Node);
-
- Application.ProcessMessages;
- end;
- end;
-
- SyncLogFmt('Loaded %d contacts (%d new, %d filtered out) from %s', [Count, CountNew, CountFiltered, Name]);
- end;
-
- function TFMAContactSource.New: TContact;
- begin
- Result := TFMAContact.Create(Self);
- end;
-
- procedure TFMAContactSource.Read(Contact: TFMAContact; FMAContact: PContactData);
- begin
- with FMAContact^ do begin
- Contact.Title := Title;
- Contact.Name := Name;
- Contact.SurName := SurName;
- Contact.Organization := Org;
- Contact.Email := EMail;
- Contact.HomePhone := Home;
- Contact.WorkPhone := Work;
- Contact.CellPhone := Cell;
- Contact.FaxPhone := Fax;
- Contact.OtherPhone := Other;
- end;
- end;
-
- procedure TFMAContactSource.Update(Contact, Value: TContact);
- begin
- with (Contact as TFMAContact).FMAContact^ do begin
- Title := Value.Title;
- Name := Value.Name;
- SurName := Value.SurName;
- Org := Value.Organization;
- Email := Value.Email;
- Home := Value.HomePhone;
- Work := Value.WorkPhone;
- Cell := Value.CellPhone;
- Fax := Value.FaxPhone;
- Other := Value.OtherPhone;
-
- StateIndex := Integer(cdsModified);
- end;
- end;
-
- { TFMAContact }
-
- function TFMAContact.Exists: Boolean;
- begin
- Result := Assigned(FFMAContact);
- end;
-
- {
- // This has as result that LinkedContact = nil
- function TFMAContact.IsDeleted: Boolean;
- begin
- Result := inherited IsDeleted or (TContactDataState(FFMAContact.StateIndex) = cdsDeleted);
- end;
- }
-
- end.
-